package Servidor;

import Comunicaciones.SocketCom;
import Comunicaciones.SocketConexion;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import java.util.ArrayList;

public class AulaVirtual {

	private ArrayList<Asignatura> _listaAsignaturas = new ArrayList<Asignatura>();
	private GestorExamen _gestorExamen;
	private ArrayList<Usuario> _listaUsuarios = new ArrayList<Usuario>();
	private ArrayList<Sesion> _listaSesiones = new ArrayList<Sesion>();
	protected SocketConexion socketConexion = null;
	static int COUNTER = 0;
	SocketCom socketCom = null;

	public AulaVirtual() {
	}

	public void arrancar(int puerto) {
		if (_listaAsignaturas == null) {
			_listaAsignaturas = new ArrayList<Asignatura>();
		}

		if (_listaUsuarios == null) {
			_listaUsuarios = new ArrayList<Usuario>();
		}

		if (_listaSesiones == null) {
			_listaSesiones = new ArrayList<Sesion>();
		}

		socketConexion = new SocketConexion(puerto);

	}

	public Examen[] getExamenes() {
		Examen[] examenes;
		int numExamenes = 0;

		for (int i = 0; i < _listaAsignaturas.size(); i++) {
			Examen[] examenesAsignatura = _listaAsignaturas.get(i).getExamenes();

			numExamenes += examenesAsignatura.length;
		}

		examenes = new Examen[numExamenes];

		int index = 0;
		for (int i = 0; i < _listaAsignaturas.size(); i++) {
			Examen[] examenesAsignatura = _listaAsignaturas.get(i).getExamenes();

			for (int j = 0; j < examenesAsignatura.length; j++) {
				examenes[index++] = examenesAsignatura[j];
			}
		}

		return examenes;
	}

	public Usuario identificar(String aUser, String aPass) {
		for (int i = 0; i < _listaUsuarios.size(); i++) {
			if (_listaUsuarios.get(i).getUser().equals(aUser) && _listaUsuarios.get(i).getPass().equals(aPass)) {
				return _listaUsuarios.get(i);
			}
		}

		return null;
	}

	public void addSesion(Sesion aS) {
		_listaSesiones.add(aS);
	}

	public void deleteSesion(Sesion aSesion) {
		_listaSesiones.remove(aSesion);
	}

	/**
	 *
	 * @param aIdAsignatura
	 * @return
	 */
	public Asignatura findAsignatura(String aIdAsignatura) {
		for (int i = 0; i < _listaAsignaturas.size(); i++) {
			if (_listaAsignaturas.get(i).getNombre().equals(aIdAsignatura)) {
				return _listaAsignaturas.get(i);
			}
		}
		return null;
	}

	public Examen findExamen(String aIdExamen) {

		for (int i = 0; i < _listaAsignaturas.size(); i++) {
			if (_listaAsignaturas.get(i).findExamen(aIdExamen) != null) {
				return _listaAsignaturas.get(i).findExamen(aIdExamen);
			}

		}
		return null;
	}

	public ExamenEspecifico generarExamen(String aIdExamen, Alumno aA) throws Exception {
		Examen e = findExamen(aIdExamen);

		if (e == null) {
			throw new Exception("No existe ese examen");
		}

		if (aA.findExamen(aIdExamen) != null) {
			throw new Exception("Este examen se ha hecho una vez.");
		}

		//este método puede generar excepciones
		return e.generarExamen(aA);
	}

	public void guardarDatos() {
		//TODO: qué es esto?
		throw new UnsupportedOperationException();
	}

	public void entrar() {

		socketCom = socketConexion.aceptarConexion();
		String aUser = socketCom.recibir();
		String aPass = socketCom.recibir();

		Usuario u = identificar(aUser, aPass);

		if (u != null) {

			String nameSesion = "Sesion" + Integer.toString(COUNTER++);
			Sesion sesion = new Sesion(this, nameSesion, socketCom);
			sesion.setUsuario(u);
			u.setSesion(sesion);

			addSesion(sesion);

			int login = 0;

			if (u instanceof Profesor) {
				login = 0;
			} else if (u instanceof Alumno) {
				login = 1;
			}

			socketCom.enviar(login + "");

			socketCom.enviar(nameSesion);
		} else {
			socketCom.enviar("-1"); //login incorrecto
		}
	}

	void addAsignatura(Asignatura a1) {
		_listaAsignaturas.add(a1);
	}

	void addUsuarios(Usuario p1) {
		_listaUsuarios.add(p1);
	}

	ArrayList<Asignatura> getAsignaturas() {
		return _listaAsignaturas;
	}

	public Usuario findUser(String idUser) {
		for (int i = 0; i < _listaUsuarios.size(); i++) {
			if (_listaUsuarios.get(i).getNombre().equals(idUser)) {
				return _listaUsuarios.get(i);
			}
		}

		return null;
	}
}